//
//  QQAutoModel.h
//  QQModelObject
//
//  Created by dereklin on 6/21/15.
//  Copyright © 2015 Tencent. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <objc/runtime.h>

/**
 *  QQAutoModel 实现了 <NSCopying> 和 <NSCoding> 协议，会自动对所有声明的 property 进行自动拷贝和序列化
 *
 *      - 如果一个 ivar 没有声明对应的 property，那么它不会被拷贝和序列化
 *      - 如果一个 property 的声明为 readonly，并且没有定义对应的 ivar 那么它也不会被拷贝和序列化
 */
@interface QQAutoModel : NSObject <NSCopying, NSCoding>

/**
 *  返回所有 @property 声明对应的 key。
 */
+ (NSOrderedSet *)propertyInfos;

/**
 * 子类可重写该方法用于排除一些无需序列化的属性
 */
+ (NSSet *)excludedPropertyKeys;

/**
 *  遍历该类的所有 property，从消息的接受者开始一直到各个父类，不包括 QQBaseModel
 *
 *  @param block 对每一个 property 调用该 block
 */
+ (void)enumeratePropertiesUsingBlock:(void (^)(objc_property_t property, BOOL *stop))block;

/**
 * 子类重写该方法用于记录当前正在encode的属性，帮助debug
 */
- (void)recordEncodingKey:(NSString *)key forClass:(Class)klass;

/**
 *  copy方法
 *
 *  @param zone       zone
 *  @param ignoreWeak 忽略weak属性
 *
 *  @return copy后的对象
 */
- (instancetype)copyWithZone:(NSZone *)zone ignoreWeak:(BOOL)ignoreWeak;

@end
